#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_jnidemo_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++ 这个是c ++代码";
    return env->NewStringUTF(hello.c_str());
}extern "C"  //extern "C"表示下面的代码使用c 的编译方式
//在c++开发时有时候没有代码提示需要在settings里面搜索Clangd 在Code Completion下拉框中选择Disable Clangd completion
/*
 * 为什么要这样，后面专门讲JNIEnv源码
    JNIEXPORT //JNIEXPORT:JNI重要标记关键字
    不能少(VS编译能通过，运行会报错)/(AS 运行不会报错)，规则(标记为该方法可以被外部调用
    void /l void代表java中的 void
    JNICALL//也是一个关键字，（可以少的）jni
    call（约束函数入栈顺序，和堆栈内存清理的规则
    // Java包名com_xx_Xx_1_类名_方法名
    //JNIEnv *env JNI桥梁核心
    // jobject == MainActivity this 实例调用的
 * */
JNIEXPORT void JNICALL
Java_com_example_jnidemo_MainActivity_change_1FromJNI(JNIEnv *env, jobject thiz) {
    // TODO: implement change_FromJNI()

    // string Student Person 0bject引用类型==
   // JNI全部命名为0bject
    jclass mainActivityCls = env->FindClass( "com/example/jnidemo/MainActivity");//方式一
//    jfieldID GetFieldID(jclass clazz, const char* name,const char* sig);
    jfieldID nameFid = env->GetFieldID(mainActivityCls,"name", "Ljava/lang/String;");

    // void SetObjectField(jobject obj，jfieldID fieldID,jobject value)
    jstring value = env->NewStringUTF("修改为c++测试名字");
    env->SetObjectField(thiz,nameFid,value);

}extern "C"
JNIEXPORT void JNICALL
Java_com_example_jnidemo_MainActivity_change_1FromJNI2(JNIEnv *env, jobject thiz) {
    // TODO: implement change_FromJNI2()
    jclass mainActivityCls = env->GetObjectClass(thiz);//方式二


    // jfieldID GetFieldID(jclass clazz，const char* name,const char* sig)
    jfieldID ageFid = env->GetFieldID(mainActivityCls,"age","I");


    //void SetIntField(jobject obj,jfieldID fieldID,jint value)
    env->SetIntField(thiz,ageFid,29);


    /**/
    //jfieldID GetStaticFieldID(jclass clazz,const chan* name,const char* sig)
    jfieldID age2Fid = env->GetStaticFieldID(mainActivityCls,"age2","I");

    int age = env->GetStaticIntField(mainActivityCls,age2Fid);// 获取之前的age

    //void SetStaticIntField(jclass clazz,jfieldID fieldID,jint value)
    env->SetStaticIntField(mainActivityCls,age2Fid,age+1);
}